package com.lfs.feishu.service;

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;

import com.lfs.feishu.domain.response.FeishuResponse;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import static com.lfs.feishu.constant.AppInfo.*;

@Service
@Slf4j

public class UserInfoService {

    @Autowired
    private RestTemplate restTemplate;

    private static final String FEISHU_AUTH_URL = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";



    public String getUserOpenId(String code) {
        return null;
    }


    public String getAppToken() throws Exception {

        // 1. 设置请求头 (Headers)
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 2. 设置请求体 (Body)
        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("app_id", APP_ID);
        requestBody.put("app_secret", APP_SECRET);

        // 3. 组合请求头和请求体为 HttpEntity
        HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(requestBody, headers);

        // 4. 发送 POST 请求
        // 使用 postForEntity 方法，它可以返回包含状态码、响应头和响应体的 ResponseEntity 对象
        ResponseEntity<String> responseEntity;
        try {
            responseEntity = restTemplate.postForEntity(
                    FEISHU_AUTH_URL,
                    requestEntity,
                    String.class // 期望响应体是 String 类型
            );
        } catch (Exception e) {
            // 处理网络异常或RestTemplate的客户端错误
            System.err.println("请求飞书API时发生错误: " + e.getMessage());
            // 根据业务需求可以抛出自定义异常或返回null
            return null;
        }

        // 业务数据处理
        log.info(JSON.toJSONString(responseEntity.getBody()));

        return JSON.parseObject(responseEntity.getBody(), TokenResponse.class).getTenant_access_token();
    }


    public FeishuResponse getByToken(String accessToken) {
        // 1. 定义请求 URL
        String url = "https://open.feishu.cn/open-apis/authen/v1/user_info";

        // 2. 设置请求头 (Headers)
        HttpHeaders headers = new HttpHeaders();
        // 设置 Content-Type，虽然 GET 请求通常不需要，但是个好习惯
        headers.setContentType(MediaType.APPLICATION_JSON);
        // 设置 Authorization 头，格式为 "Bearer {token}"
        headers.setBearerAuth(accessToken);

        // 3. 创建 HttpEntity 对象，封装请求头
        // 对于 GET 请求，请求体 (body) 为 null
        HttpEntity<String> entity = new HttpEntity<>(null, headers);

        // 4. 发送请求
        // 使用 exchange 方法，它可以灵活地处理各种请求类型并返回详细的响应信息
        try {
            ResponseEntity<FeishuResponse> response = restTemplate.exchange(
                    url,
                    HttpMethod.GET,
                    entity,
                    FeishuResponse.class
            );

            // 5. 处理响应
            if (response.getStatusCode() == HttpStatus.OK) {
                return response.getBody();
            } else {
                // 在这里处理非 200 OK 的情况，例如记录日志
                System.err.println("请求失败，状态码: " + response.getStatusCode());
                System.err.println("响应体: " + response.getBody());
                return null;
            }
        } catch (Exception e) {
            // 处理网络异常或其他 RestTemplate 相关的异常
            System.err.println("调用飞书 API 时发生错误: " + e.getMessage());
            // 实际项目中应该使用日志框架，如 SLF4J
            // log.error("Error calling Feishu API", e);
            return null;
        }
    }



    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    static class TokenResponse {
        private int code;
        private String msg;
        private String tenant_access_token;
        private int expire;
    }
}
